const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

module.exports = {
  // 工作模式 development|production
  mode: 'development',
  // 配置devtool设置源文件映射
  devtool: 'eval-cheap-module-source-map',
  // 配置自动化编译
  devServer: {
    open: true, // 自动打开浏览器
    compress: true, // 启动gzip压缩
    port: 8000, // 端口号
    hot: true // 开启热模替换功能 HMR
  },
  // 入口（从哪里进入开始解析）
  entry: ['./src/js/index.js', './src/index.html'],
  // 出口（最终加工完的代码输出到哪里）
  output: {
    path: resolve(__dirname, '../dist'), // 输出文件路径配置
    filename: './js/index.js', // 输出文件名
    publicPath: '/' // 所有输出资源在引入时的公共路径
  },
  // loader配置
  module: {
    rules: [
      // 解析less(不完美)
      /* {
        test: /\.less$/,
        use: ['style-loader', 'css-loader', 'less-loader']
      }, */
      // eslint语法检查
      {
        enforce: 'pre', // 提前加载使用
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
      },
      // js语法转换+兼容性处理（es6->es5）
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              ['@babel/preset-env', {
                useBuiltIns: 'usage', // 按需引入polyfill
                corejs: { version: 3 }, // 解决warn
                targets: { // 指定兼容性处理哪些浏览器
                  "ie": "9",
                  "chrome": "58"
                }
              }]
            ],
            cacheDirectory: true // 开启babel缓存
          }
        }
      },
      // 处理图片资源
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 8192,// 8kb --> 8kb以下的图片会base64处理
              publicPath: '/images/',  // 决定图片的url路径
              outputPath: 'images', // 决定文件本地输出路径
              name: '[hash:5].[ext]' // 修改文件名称 [hash:8] hash值取8位  [ext] 文件扩展名
            },
          }
        ]
      },
      // 处理html中图片资源
      {
        test: /\.html$/i,
        loader: 'html-loader',
      },
      // 处理其它资源，如：字体图标
      {
        test: /\.(eot|svg|woff|woff2|ttf|mp3|mp4|avi)$/,  // 处理其他资源
        loader: 'file-loader',
        options: {
          outputPath: 'media',
          name: '[hash:5].[ext]'
        }
      },
      // 提取less为单独文件
      {
        test: /\.less$/i,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader', // 将less编译后的css转换成为CommonJs的一个模块。
          'less-loader'
        ],
      }
    ]
  },
  // 插件配置
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html' // 以当前文件为模板创建新的html（结构和原来一样，会自动引入打包的资源）
    }),
    new CleanWebpackPlugin(), // 自动清除output.path目录下的文件
    new MiniCssExtractPlugin({
      filename: 'css/[hash:5].css'
    })
  ]
}